<?php

//商品分类
namespace App\Http\Controllers\Admin\Mall;

use App\Enums\MallEnum;
use App\Exceptions\BasicException;
use App\Http\Controllers\BaseController;
use App\Response\Response;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class ProductCateController extends BaseController
{
    //主模型
    private $model;

    public function __construct()
    {
        $this->model = app('model_mall_categories');
    }

    /**
     * @api {Get} /mall/product-cate/all 获取所有分类
     *
     * @apiGroup 个性商城-类别管理
     *
     * @apiSuccessExample {json} Response-Example
     * {
    "code": 200,
    "data": [
    {
    "id": 6, 序号
    "title": "入场特效", 分类名称
    "sort": 0, 排序号
    "is_show": 1, 是否显示：1：是；0：否
    "is_join_suit": 1, 是否可以加入套装：1：是；0：否
    "is_join_discount": 1, 是否可以打折：1：是；0：否
    "is_join_activity": 1, 是否可以加入活动专区：1：是；0：否
    "is_join_nobility": 1, 是否可以加入爵位专区：1：是；0：否
    "is_join_rarity": 1, 是否可以加入稀有专区：1：是；0：否
    "level": 0 分类层级，0：最顶级，1：第二级，以此类推
    }
    ]
    }
     */
    public function all()
    {
        //排除靓号相关的分类id
        $goodCodeCateIds = app('model_mall_categories')->getAllSubCateId(MallEnum::PRODUCT_CATE_ID_GOOD_CODE);
        $goodCodeCateIds[] = MallEnum::PRODUCT_CATE_ID_GOOD_CODE;

        $list = $this->model
            ->select('id', 'title', 'parent_id', 'sort', 'is_show', 'is_join_suit', 'is_join_discount', 'is_join_activity', 'is_join_nobility', 'is_join_rarity')
            ->whereNotIn('parent_id', $goodCodeCateIds)
            ->orderBy('parent_id', 'asc')
            ->orderBy('sort', 'desc')
            ->get()->toArray();

        if (isset($list[0])) {
            $list = $this->getTree($list);
        }
        foreach ($list as $k => $v) {
            if ($v['parent_id'] == 0) {
                unset($list[$k]);
            }
        }
        return Response::sendData(array_values($list));
    }

    //分类树排序
    private function getTree($list, $pid = 0, $level = 0)
    {
        static $tree = [];
        foreach ($list as $row) {
            if ($row['parent_id'] == $pid) {
                $row['level'] = $level;
                $tree[] = $row;
                self::getTree($list, $row['id'], $level + 1);
            }
        }
        return $tree;
    }

    /**
     * @api {Get} /mall/product-cate/of-all 获取‘全部’类别下的所有分类
     *
     * @apiGroup 个性商城-类别管理
     *
     * @apiSuccessExample {json} Response-Example
     * {
    "code": 200,
    "data": [
    {
    "id": 6, 序号
    "title": "入场特效", 分类名称
    "sort": 0, 排序号
    "is_show": 1, 是否显示：1：是；0：否
    "is_join_suit": 1, 是否可以加入套装：1：是；0：否
    "is_join_discount": 1, 是否可以打折：1：是；0：否
    "is_join_activity": 1, 是否可以加入活动专区：1：是；0：否
    "is_join_nobility": 1, 是否可以加入爵位专区：1：是；0：否
    "is_join_rarity": 1, 是否可以加入稀有专区：1：是；0：否
    "level": 0 分类层级，0：最顶级，1：第二级，以此类推
    }
    ]
    }
     */
    public function getCatesOfAll()
    {
        $list = app('model_mall_categories')->getCategories([['id', '<>', MallEnum::PRODUCT_CATE_ID_SUIT], ['id', '<>', MallEnum::PRODUCT_CATE_ID_GOOD_CODE]]);

        return Response::sendData($list);
    }

    /**
     * @api {Post} /mall/product-cate/add 新增分类
     *
     * @apiGroup 个性商城-类别管理
     *
     * @apiParam {Int} parent_id 金刚区分类id，必须
     * @apiParam {String} cate_name 分类名称，必须
     * @apiParam {String} icon 分类图标，顶级分类必须
     * @apiParam {Int} sort 排序号，降序，必须
     * @apiParam {Int} is_show 是否显示：1：是；0：否，必须
     * @apiParam {Int} is_join_suit 是否可以加入套装：1：是；0：否
     * @apiParam {Int} is_join_discount 是否可以打折：1：是；0：否
     * @apiParam {Int} is_join_activity 是否可以加入活动专区：1：是；0：否
     * @apiParam {Int} is_join_nobility 是否可以加入爵位专区：1：是；0：否
     * @apiParam {Int} is_join_rarity 是否可以加入稀有专区：1：是；0：否
     *
     * @apiSuccessExample {json} Response-Example
     * {
    "code": 200,
    "data": []
    }
     */
    public function add(Request $request)
    {
        //参数校验
        $v = app('validator')->make($request->all(),
            [
                'parent_id' => 'required|integer|min:0',
                'cate_name' => 'required|string|min:1|max:10',
                'icon' => 'required_if:parent_id,0|url',
                'sort' => 'required|integer|min:0',
                'is_show' => 'required|integer|in:0,1',
                'is_join_suit' => 'integer|in:0,1',
                'is_join_discount' => 'integer|in:0,1',
                'is_join_activity' => 'integer|in:0,1',
                'is_join_nobility' => 'integer|in:0,1',
                'is_join_rarity' => 'integer|in:0,1',
            ]);
        if ($v->fails()) throw new BasicException(10001, $v->errors()->first());

        return app('repo_mall_categories')->addOrEdit($request->all());
    }

    /**
     * @api {put} /mall/product-cate/edit 编辑分类
     *
     * @apiGroup 个性商城-类别管理
     *
     * @apiParam {Int} id 分类id，必须
     * @apiParam {Int} parent_id 金刚区分类id，必须
     * @apiParam {String} cate_name 分类名称，必须
     * @apiParam {String} icon 分类图标，顶级分类必须
     * @apiParam {Int} sort 排序号，降序，必须
     * @apiParam {Int} is_show 是否显示：1：是；0：否，必须
     * @apiParam {Int} is_join_suit 是否可以加入套装：1：是；0：否
     * @apiParam {Int} is_join_discount 是否可以打折：1：是；0：否
     * @apiParam {Int} is_join_activity 是否可以加入活动专区：1：是；0：否
     * @apiParam {Int} is_join_nobility 是否可以加入爵位专区：1：是；0：否
     * @apiParam {Int} is_join_rarity 是否可以加入稀有专区：1：是；0：否
     *
     * @apiSuccessExample {json} Response-Example
     * {
    "code": 200,
    "data": []
    }
     */
    public function edit(Request $request)
    {
        //参数校验
        $v = app('validator')->make($request->all(),
            [
                'id' => 'required|integer|min:1',
                'parent_id' => 'required|integer|min:0',
                'cate_name' => 'required|string|min:1|max:10',
                'icon' => 'required_if:parent_id,0|url',
                'sort' => 'required|integer|min:0',
                'is_show' => 'required|integer|in:0,1',
                'is_join_suit' => 'integer|in:0,1',
                'is_join_discount' => 'integer|in:0,1',
                'is_join_activity' => 'integer|in:0,1',
                'is_join_nobility' => 'integer|in:0,1',
                'is_join_rarity' => 'integer|in:0,1',
            ]);
        if ($v->fails()) throw new BasicException(10001, $v->errors()->first());

        return app('repo_mall_categories')->addOrEdit($request->all());
    }

    /**
     * @api {delete} /mall/product-cate/del 删除分类
     *
     * @apiGroup 个性商城-类别管理
     *
     * @apiParam {String} ids 分类id，多个之间用英文逗号连接，必须
     *
     * @apiSuccessExample {json} Response-Example
     * {
    "code": 200,
    "data": []
    }
     */
    public function del(Request $request)
    {
        //参数校验
        $v = app('validator')->make($request->all(),
            [
                'ids' => 'required|string',
            ]);
        if ($v->fails()) throw new BasicException(10001, $v->errors()->first());

        $ids = explode(',', $request->ids);

        DB::beginTransaction();
        try {
            foreach ($ids as $id) {
                $this->delCate($id);
            }

            DB::commit();
            return Response::sendData([]);
        } catch (\Exception $e) {
            DB::rollBack();
            throw new BasicException(0, $e->getMessage());
        }
    }

    //递归删除所有分类及其子分类
    private function delCate($cateId)
    {
        //删除自己
        $cate = $this->model->select('title')->where('id', $cateId)->first();
        if (empty($cate)) throw new BasicException(0, '分类id错误');
        $productId = app('model_mall_products')->where('category_id', $cateId)->value('id');
        if ($productId) throw new BasicException(0, "{$cate->title} 分类下面有商品，无法删除");
        $this->model->where('id', $cateId)->delete();

        //退出递归的条件
        $subCates = $this->model->select('id')->where('parent_id', $cateId)->get();
        if (empty($subCates)) return true;

        //删除子分类
        foreach ($subCates as $subCate) {
            $this->delCate($subCate->id);
        }
    }
}